package eMdP.estats;

import java.net.URL;
import java.util.LinkedList;
import java.util.concurrent.Callable;

import com.jme.input.InputHandler;
import com.jme.input.MouseInput;
import com.jme.math.Vector3f;
import com.jme.system.DisplaySystem;
import com.jme.util.GameTaskQueueManager;
import com.jme.util.Timer;
import com.jmex.bui.BImage;
import com.jmex.bui.BWindow;
import com.jmex.bui.BuiSystem;
import com.jmex.bui.PolledRootNode;
import com.jmex.bui.layout.AbsoluteLayout;
import com.jmex.physics.util.states.PhysicsGameState;

import eMdP.gestors.GestorFitxers;

public class GbuiGameState extends PhysicsGameState {
	// Unless we find a reason to have one of these for each sub-class, let's just share static instances
	protected static DisplaySystem display;
	protected static InputHandler input = new InputHandler();
	protected BWindow window;

	static {
		display = DisplaySystem.getDisplaySystem();
		BuiSystem.init(new PolledRootNode(Timer.getTimer(), input), "/eMdP/estils/estil.bss");
		
	}

	public GbuiGameState(String name) {
		super(name);
		display = DisplaySystem.getDisplaySystem();
		BuiSystem.init(new PolledRootNode(Timer.getTimer(), input), "/eMdP/estils/estil.bss");
		
		MouseInput.get().setCursorVisible(true);
		window = new BWindow(BuiSystem.getStyle(), new AbsoluteLayout());
	}
	
	public BWindow getFinestra()
	{
		return window;
	}

	@Override
	public void render(float tpf)
	{
		super.render(tpf);
	}
	
	@Override
	public void update(float tpf) {
		super.update(tpf);
		display.getRenderer().getCamera().update();
		input.update(tpf);
	}
	
	public void activate() {
		// activa el main GameState
		super.setActive(true);
		
		// S'ocupa de mostrar la part del GBUI
		rootNode.attachChild(BuiSystem.getRootNode());
		//final BWindow finestraTmp = this.window;
		GameTaskQueueManager.getManager().update(new Callable<Object>() {
			public Object call() throws Exception {
				BuiSystem.addWindow(window);
				window.center();
				return null;
			}
		});
		rootNode.updateRenderState();
	}

	public void deactivate() {
		// Si encara està activat, amaga la part del GBUI
		if (window.getRootNode() != null) {
			window.dismiss();
		}
		rootNode.detachChild(BuiSystem.getRootNode());
		
		// Desactivem la part del main GameState
		super.setActive(false);
	}
	
	public String[] getNomsPantalles()
	{
		LinkedList<String> noms = GestorFitxers.getNomsPantalles();
		
		String[] pantalles = new String[noms.size()];
		for(int i=0; i<noms.size(); i++)
			pantalles[i] = noms.get(i);
		
		return pantalles;
	}
	
	public BImage[] getImatgesPantalles(String[] pantalles)
	{
		
		BImage[] imatges = new BImage[pantalles.length];
		for(int i=0; i<pantalles.length; i++)
		{
			String nomTmp;
			nomTmp = pantalles[i].toLowerCase();
			nomTmp = nomTmp.replace(" ","_");
			String resource = "eMdP/escenaris/imatges/"+nomTmp+".png";
			URL url = MenuIniciarPartidaUnJugador.class.getClassLoader().getResource(resource);
			try
	    	{
				imatges[i] = new BImage(url);
	    	} catch (Exception e)
	    	{
	    		System.out.println("No entro dintre el try de les imatges!");
	    	};
		}
		
		return imatges;
	}
	
	
	public String[] getNomsPersonatges(boolean multijugador)
	{
		LinkedList<String> noms = GestorFitxers.getNomsPersonatges();
		if(multijugador)
			noms.add("Cap Jugador");
		
		String[] personatges = new String[noms.size()];
		for(int i=0; i<noms.size(); i++)
			personatges[i] = noms.get(i);
		
		return personatges;
	}
	
	public BImage[] getImatgesPersonatges(String[] noms, boolean multijugador)
	{	
		BImage[] imatges = new BImage[noms.length];
		
		for(int i=0; i<imatges.length; i++)
		{
			String nomTmp;
			if(multijugador && i == imatges.length-1)
			{
				nomTmp = "cap_jugador";
			}
			else
			{
				nomTmp = noms[i].toLowerCase();
				nomTmp = nomTmp.replace(" ","_");
				
			}
			String resource = "eMdP/personatges/imatges/"+nomTmp+".png";
			URL url = MenuIniciarPartidaUnJugador.class.getClassLoader().getResource(resource);
			try
	    	{
				imatges[i] = new BImage(url);
				if(multijugador)
					imatges[i].setLocalScale(new Vector3f(0.5f, 0.5f, 0.5f));
	    	} catch (Exception e)
	    	{
	    		System.out.println("No entro dintre el try de les imatges!");
	    	};
		}
		
		return imatges;
	}
}
